package controles;

import java.util.ArrayList;
import juego.Escenario;
import objetos.aeronaves.*;
import objetos.powerUps.PowerUp;
import objetos.proyectiles.Proyectil;

/*
 * Control que hace colisionar a los objetos durante la simulaci�n
 */
public class ControlColisiones implements Control {

	/*
	 * Llama a los m�todos que verifican posibles colisiones y las ejecuta
	 */
	public void ejecutar() {
		hacerColisionarAeronaves();
		hacerColisionarAlgo42();
		hacerColisionarEnemigos();
		hacerColisionarCiviles();
	}

	public void hacerColisionarAeronaves() {
		hacerColisionesDeEnemigos();
		hacerColisionesDeCiviles();
	}

	public void hacerColisionarAlgo42() {
		hacerColisionesDeProyectilesEnemigos();
		hacerColisionesDePowerUps();
	}

	public void hacerColisionarEnemigos() {
		hacerColisionesProyectilAmigosContraEnemigos();
	}

	public void hacerColisionarCiviles() {
		hacerColisionesProyectilAmigosContraCiviles();
	}

	private void hacerColisionesDeEnemigos() {
		Algo42 algo42 = Escenario.getInstance().getActor();
		ArrayList<Enemigo> enemigos = Escenario.getInstance().getEnemigos();
		int largo = enemigos.size();
		Enemigo enemigo;

		for (int i = 0; i < largo; i++) {
			enemigo = enemigos.get(i);
			if (enemigo.estaEnColisionCon(algo42)) {
				enemigo.colisionConAlgo42(algo42);
				if (enemigo.estaDestruido()) {
					Escenario.getInstance().destruiUnEnemigo();
				}
			}
		}
		if (algo42.estaEnColisionCon(Escenario.getInstance().getAvionGuia())) {
			algo42.colisionCon(Escenario.getInstance().getAvionGuia());
		}
	}

	private void hacerColisionesDeCiviles() {
		Algo42 algo42 = Escenario.getInstance().getActor();
		ArrayList<Civil> civiles = Escenario.getInstance().getCiviles();
		int largo = Escenario.getInstance().getCiviles().size();
		Civil civil;

		for (int i = 0; i < largo; i++) {
			civil = civiles.get(i);
			if (civil.estaEnColisionCon(algo42)) {
				civil.colisionConAlgo42(algo42);
				if (civil.estaDestruido()) {
					Escenario.getInstance().destruiUnCivil();
				}
			}
		}
	}

	private void hacerColisionesProyectilAmigosContraEnemigos() {
		ArrayList<Enemigo> enemigos = Escenario.getInstance().getEnemigos();
		int largoEnemigos = enemigos.size();
		Enemigo enemigo;
		ArrayList<Proyectil> proyectiles = Escenario.getInstance()
				.getProyectilesDelAlgo42();
		int largoProyectiles = proyectiles.size();
		Proyectil proyectil;

		for (int j = 0; j < largoProyectiles; j++) {
			proyectil = proyectiles.get(j);
			for (int i = 0; i < largoEnemigos; i++) {
				enemigo = enemigos.get(i);
				if (enemigo.estaEnColisionCon(proyectil)) {
					enemigo.colisionConProyectil(proyectil);
					if (enemigo.estaDestruido()) {
						Escenario.getInstance().destruiUnEnemigo();
					}
				}
			}
			if (proyectil.estaEnColisionCon(Escenario.getInstance()
					.getAvionGuia())) {
				Escenario.getInstance().getAvionGuia().colisionConProyectil(
						proyectil);
			}
		}
	}

	private void hacerColisionesProyectilAmigosContraCiviles() {
		ArrayList<Civil> civiles = Escenario.getInstance().getCiviles();
		int largoCiviles = civiles.size();
		Civil civil;
		ArrayList<Proyectil> proyectiles = Escenario.getInstance()
				.getProyectilesDelAlgo42();
		int largoProyectiles = proyectiles.size();
		Proyectil proyectil;

		for (int i = 0; i < largoCiviles; i++) {
			civil = civiles.get(i);
			for (int j = 0; j < largoProyectiles; j++) {
				proyectil = proyectiles.get(j);
				if (civil.estaEnColisionCon(proyectil)) {
					civil.colisionConProyectil(proyectil);
					if (civil.estaDestruido()) {
						Escenario.getInstance().destruiUnCivil();
					}
				}
			}
		}
	}

	private void hacerColisionesDeProyectilesEnemigos() {
		Algo42 algo42 = Escenario.getInstance().getActor();
		ArrayList<Proyectil> proyectiles = Escenario.getInstance()
				.getProyectilesEnemigos();
		int largoProyectiles = proyectiles.size();
		Proyectil proyectil;

		for (int i = 0; i < largoProyectiles; i++) {
			proyectil = proyectiles.get(i);
			if (proyectil.estaEnColisionCon(algo42)) {
				proyectil.colisionConAlgo42(algo42);
			}
		}
	}

	private void hacerColisionesDePowerUps() {
		Algo42 algo42 = Escenario.getInstance().getActor();
		ArrayList<PowerUp> powerUps = Escenario.getInstance().getPowerUps();
		int largoPowerUps = powerUps.size();
		PowerUp powerUp;

		for (int i = 0; i < largoPowerUps; i++) {
			powerUp = powerUps.get(i);
			if (powerUp.estaEnColisionCon(algo42)) {
				powerUp.colisionConAlgo42(algo42);
			}
		}
	}

}
